package net.pm.common.service;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

import net.pm.common.toolkit.Pager;

/**
 * 公共的服务接口，
 * @author shizeyuan
 *
 * @param <T>
 * @param <ID>
 */
public interface GenericServicer<T extends Serializable, ID extends Serializable> {
	
	/**创建一个实体
	 * @param t
	 * @return
	 */
	ID create(final T t);
	
	/**批量创建
	 * @param ts
	 */
	void batchCreate(final Collection<T> ts);
	
	/**删除一个实体
	 * @param t
	 */
	void remove(final T t);
	
	/**根据id删除一个实体
	 * @param id
	 */
	void removeById(final ID id);
	
	/**根据jpql删除一个实体
	 * @param jpql
	 * @param args
	 */
	Integer removeByJpql(final StringBuilder jpql,final Object... args);
	
	/**批量删除
	 * @param ids
	 */
	void batchRemove(final Collection<ID> ids);
	
	/**更新一个实体
	 * @param t
	 */
	void modify(final T t);
	
	/**根据jpql更新一个实体
	 * @param jpql
	 * @param args
	 */
	Integer modifyByJpql(final StringBuilder jpql,final Object... args);
	
	/**批量更新
	 * @param ts
	 */
	void batchModify(Collection<T> ts);
	
	/**创建或者更新
	 * @param t
	 */
	void createOrModify(final T t);
	
	/**根据id加载实体
	 * @param id
	 * @return
	 */
	T loadEntityById(final ID id);
	
	/**根据ID查找实体
	 * @param id
	 * @return
	 */
	T findEntityById(final ID id);
	
	/**根据jpql查找实体集合
	 * @param jpql
	 * @param args
	 * @return
	 */
	List<T> findEntitiesByJpql(final StringBuilder jpql,final Object... args);
	
	/**根据jpql查找唯一的一条记录
	 * @param jpql
	 * @param args
	 * @return
	 */
	T findUniqueEntityByJpql(final StringBuilder jpql,final Object... args);
	
	/**分页
	 * @param pagesize 页宽
	 * @param pageno　　页码
	 * @param jpql   
	 * @param args
	 * @return
	 */
	Pager<T> findPagerByJpql(final Integer pagesize,final Integer pageno,final StringBuilder jpql,final Object... args);
	
	/**查找所有
	 * @return
	 */
	List<T> findAll();
	
	/**获取总记录数
	 * @return
	 */
	Long findCountAll();
	
	/**根据jpql查找记录数
	 * @param jpql
	 * @param args
	 * @return
	 */
	Long findCountByJpql(final StringBuilder jpql,final Object... args);
	
	/**调用存储过程
	 * @param procName 存储过程名称
	 * @return
	 */
	List<?> CallProcedure(String procName);
	
	void commit();
}
